import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Obstaculo here.
 * 
 * @author Montes Alonso Irli Natali
 * @version Programacion Orientada a Objetos
 */
public class Obstaculo extends Actor
{
    private boolean encObstaculo;
    private Portador abajo;

    /**
     * Constructor de un Obstaculo
     */
    public Obstaculo()
    {
        encObstaculo=false;
    }

    /**
     * Metodo de act
     */
    public void act() 
    {
        World mundo=super.getWorld();

        if(seEncuetraObstaculo())
            encObstaculo=true;

        if(caeObjeto()==(400-1))
        {
            encObstaculo=true;
        }
    }    

    /**
     * Metodo para lograr que los objetos caigan siempre y cuando no se encuentre un obstaculo
     * en el caso de los cactus pueden rotar
     */
    public int caeObjeto()
    {

        if(!seEncuetraObstaculo())
        {
            if(getY()>=0)
            {
                baja();
            }
        }
        else
        {
            int rotacion;
            rotacion= abajo.getRotation();
            if(rotacion==0|| rotacion==180)
            {
                return 0;
            }
            else
            {
                if(rotacion==90||rotacion==270)
                    baja();
                else
                {
                    if(rotacion>=10&& rotacion<= 80)
                    {
                        if(abajo instanceof Maderota)
                        {
                            if(!((Maderota)abajo).yaNoEstaCaja())
                                mueveX(0);
                        }
                    }
                    else
                    if(rotacion<=360-10&& rotacion>= 360-80)
                    {
                        if(abajo instanceof Maderota)
                        {
                            if(!((Maderota)abajo).yaNoEstaCaja())
                                mueveX(1);
                        }
                    }
                }

            }
            abajo=null;
        }
        encObstaculo=false;
        return 0;
    }

    /**
     * Metodo que compra si no se encontro un obstaculo y que su rotacion sea diferente de 90 y 270
     * @return encObstaculo, bandera regresa true para detectar si se encontro un obstaculo
     * @return encObstaculo, bandera regresa false si no se encontro un obstaculo
     */
    public boolean seEncuetraObstaculo()
    {
        Actor madera=super.getOneIntersectingObject(Portador.class);
        if(madera != null&& (madera.getRotation()!=90&&madera.getRotation()!=360-90))
            encObstaculo=true;
        else
            encObstaculo=false;
        abajo=(Portador)madera;
        return encObstaculo;
    }

    /**
     * Metodo que hacer que un objeto se mueva hacia la izquierda o hacia la derecha
     * @param dir, si se manda un 0 cantidad se igualara a la posicion de x y se movera a la derecha
     * @param dir, si recibe un 1 a la posicion de x se le restara 1 asi que se mover a la izquierda
     */
    public void mueveX(int dir)
    {
        int mueve=1,cantidad=0; 
        switch(dir)
        {
            case 0:

            cantidad=(getX()+mueve);
            break;

            case 1:
            cantidad=(getX()-mueve);
            break;
        }
        setLocation(cantidad,getY());
    }

    /**
     * Metodo para hacer que bajen los objetos, si llegan hasta la posicion de abajo se eliminan del mundo
     */
    public void baja()
    {
        World mundo=super.getWorld();
        int baja=4,cantidad=0;

        cantidad=(getY()+baja);
        setLocation(getX(),cantidad);

        if(getY()==(400-1))
            mundo.removeObject(this);
    }
}
